/*
 * 描述： <描述>
 * 修改人： rain
 * 修改时间： 2016年10月14日
 * 项目： rainhy-property
 */
package com.rainhy.property.context;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.collections.MapUtils;
import org.springframework.beans.factory.InitializingBean;

import com.rainhy.core.util.AssertUtils;

/**
 * 属性容器建造者
 * 
 * @author rain
 * @version [版本号, 2016年10月14日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class PropertyContextBuilder extends PropertyContextConfigurator implements InitializingBean {
    /**
     * 属性类型和属性管理器的映射,key:propertyType<br>
     * 如果 key 为空,或者 propertyType 获取不到对应的属性管理器,则返回默认的管理器
     */
    protected Map<String, PropertyManager> propertyType2PropertyManagerMapping = new HashMap<>();
    
    /**
     * // * 属性类类型和属性转换器的映射,key:propertyType<br>
     * // * 如果 key 为空,或者 propertyClassType 获取不到对应的属性转换器,则返回默认的管理器 //
     */
    //    protected Map<Class<?>, PropertyConverter<?>> propertyClassType2PropertyConverterMapping = new HashMap<>();
    
    @Override
    public void afterPropertiesSet() throws Exception {
        super.afterPropertiesSet();
        AssertUtils.contains(this.propertyType2PropertyManagerMapping, null, "请注入默认的属性管理器.");
        //        if (!this.propertyClassType2PropertyConverterMapping.containsKey(null)) {
        //            this.propertyClassType2PropertyConverterMapping.put(null, new DefaultPropertyConverter());
        //        }
    }
    
    //    /** 属性类类型和属性转换器的映射,key:propertyType */
    //    @SuppressWarnings("unchecked")
    //    public Map<Class<?>, PropertyConverter<?>> getPropertyClassType2PropertyConverterMapping() {
    //        return MapUtils.unmodifiableMap(propertyClassType2PropertyConverterMapping);
    //    }
    
    //    /**
    //     * 
    //     * 根据属性类类型获取属性转换器
    //     *
    //     * @param propertyClassType
    //     * 
    //     * @return PropertyConverter<?> 属性转换器
    //     * @throws [异常类型] [异常说明]
    //     * @see [类、类#方法、类#成员]
    //     * @version [版本号, 2016年10月14日]
    //     * @author rain
    //     */
    //    @SuppressWarnings("unchecked")
    //    public <T> PropertyConverter<T> getPropertyConverter(Class<T> propertyClassType) {
    //        if (this.propertyClassType2PropertyConverterMapping.containsKey(propertyClassType)) {
    //            return (PropertyConverter<T>) this.propertyClassType2PropertyConverterMapping.get(propertyClassType);
    //        }
    //        return (PropertyConverter<T>) this.propertyClassType2PropertyConverterMapping.get(null);
    //    }
    
    /**
     * 根据属性类型获取属性管理器
     *
     * @param propertyType 属性类型
     * 
     * @return PropertyManager [返回类型说明]
     * @throws [异常类型] [异常说明]
     * @see [类、类#方法、类#成员]
     * @version [版本号, 2016年10月10日]
     * @author rain
     */
    public PropertyManager getPropertyManager(String propertyType) {
        if (this.propertyType2PropertyManagerMapping.containsKey(propertyType)) {
            return this.propertyType2PropertyManagerMapping.get(propertyType);
        }
        return this.propertyType2PropertyManagerMapping.get(null);
    }
    
    /** 属性类型和属性管理器的映射,key:propertyType */
    @SuppressWarnings("unchecked")
    public Map<String, PropertyManager> getPropertyType2PropertyManagerMapping() {
        return MapUtils.unmodifiableMap(propertyType2PropertyManagerMapping);
    }
    
    //    /** 设置默认的属性类类型转换器 */
    //    public void setDefaultPropertyClassType(PropertyConverter<?> defaultPropertyConverter) {
    //        AssertUtils.isNull(defaultPropertyConverter.supportType(), "默认的属性转换器器的属性类类型必须为null.");
    //        this.propertyClassType2PropertyConverterMapping.put(null, defaultPropertyConverter);
    //    }
    
    /** 默认的属性管理器 */
    public void setDefaultPropertyManager(PropertyManager propertyManager) {
        AssertUtils.isNull(propertyManager.propertyType(), "默认的属性管理器的属性类型必须为null.");
        this.propertyType2PropertyManagerMapping.put(null, propertyManager);
    }
    
    //    /** 属性类类型和属性转换器的映射,key:propertyType */
    //    public void setPropertyClassType2PropertyConverterMapping(Map<Class<?>, PropertyConverter<?>> propertyClassType2PropertyConverterMapping) {
    //        this.propertyClassType2PropertyConverterMapping = propertyClassType2PropertyConverterMapping;
    //    }
    
    /** 属性类型和属性管理器的映射,key:propertyType */
    public void setPropertyType2PropertyManagerMapping(Map<String, PropertyManager> propertyType2PropertyManagerMapping) {
        this.propertyType2PropertyManagerMapping = propertyType2PropertyManagerMapping;
    }
}
